/**
 * @file Server.h
 * @brief CLink HTTP服务器实现
 * 
 * 该文件定义了CLink的HTTP服务器核心类，负责处理HTTP请求和响应，
 * 管理服务器生命周期和配置。
 */

#ifndef SERVER_H
#define SERVER_H

#include <Poco/Net/HTTPServer.h>
#include <Poco/Net/HTTPServerParams.h>
#include <Poco/Net/ServerSocket.h>
#include <Poco/Net/SecureServerSocket.h>
#include <string>
#include <vector>
#include <memory>
#include <mutex>

#include "../Router/Router.h"
#include "../Utils/Utils.h"

namespace CLink
{
namespace Server
{
/**
 * @struct ServerConfig
 * @brief 服务器配置参数结构体
 */
struct CLINK_CLASS  ServerConfig
{
    Poco::UInt16 port;       ///< HTTP服务端口号
    int securePort;          ///< HTTPS服务端口号
    int maxThreads;          ///< 最大工作线程数
    int maxQueued;           ///< 最大排队请求数
    bool keepAlive;          ///< 是否启用长连接
    int timeout;             ///< 请求超时时间(秒)
    bool enableHttps;        ///< 是否启用HTTPS
    std::string certFile;    ///< SSL证书文件路径
    std::string keyFile;     ///< SSL私钥文件路径
    std::string caLocation;  ///< CA证书目录路径
};

/**
 * @class Server
 * @brief HTTP服务器主类
 * 
 * 负责管理HTTP服务器的生命周期，包括初始化、启动、停止和重启。
 * 提供服务器配置管理和请求路由功能。
 */
class CLINK_CLASS Server
{
public:
    /**
     * @brief 设置日志记录器
     * @param logger Poco日志记录器引用
     */
    void setLogger(Poco::Logger& logger);

    /**
     * @brief 初始化服务器配置
     * @param config 服务器配置参数
     */
    void initialize(const ServerConfig &config);

    /**
     * @brief 启动HTTP服务器
     * @throws std::runtime_error 如果服务器未初始化或启动失败
     */
    void start();

    /**
     * @brief 停止HTTP服务器
     */
    void stop();

    /**
     * @brief 重启HTTP服务器
     */
    void restart();

    /**
     * @brief 获取路由器实例
     * @return Router& 路由器实例引用
     */
    CLink::Router::Router* getRouter();

    /**
     * @brief 获取当前服务器配置
     * @return const ServerConfig& 服务器配置引用
     */
    const ServerConfig &getConfig() const;

    /**
     * @brief 更新服务器配置
     * @param config 新的服务器配置
     */
    void setConfig(const ServerConfig &config);

    /**
     * @brief 检查服务器运行状态
     * @return bool 是否正在运行
     */
    bool isRunning() const;

    /**
     * @brief 私有构造函数
     */
    Server();

    /**
     * @brief 私有析构函数
     */
    ~Server();

private:

    bool _initialized;                                  ///< 初始化标志
    bool _running;                                      ///< 运行状态标志
    ServerConfig _config;                               ///< 服务器配置
    mutable std::mutex _mutex;                          ///< 线程安全锁
    std::unique_ptr<Poco::Net::HTTPServer> _httpServer; ///< Poco HTTP服务器实例
    Poco::Logger* _pLogger{ nullptr };                  ///< 日志记录器指针
	CLink::Router::Router _router;                      ///< 路由器实例
};
}
}
#endif // SERVER_H